"""
异步环境中的上下文管理器，用于保存当前的token
ContextVar 是一个适用于异步环境的上下文变量，
可以替代 threading.local。它适用于异步代码（例如 Django Channels）中存储请求级别的数据。
"""

from contextvars import ContextVar

from asgiref.sync import sync_to_async
from django.contrib.auth import get_user_model
from rest_framework_simplejwt.tokens import AccessToken

from users.models import Users

User = get_user_model()  # 获取用户模型
current_token = ContextVar('current_token', default=None)


async def get_user_from_token(token):
    try:
        access_token = AccessToken(token)
        user_id = access_token['user_id']
        return await sync_to_async(User.objects.get)(user_id=user_id)
    except Exception as e:
        print(f"Token error: {e}")
        return None


def get_cur_token():
    return current_token.get()


def set_cur_token(token):
    current_token.set(token)


async def get_cur_user() -> Users:
    return await get_user_from_token(get_cur_token())
